package traveldream.ejb.entities;

import java.io.Serializable;
import java.lang.String;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.*;

/**
 * Entity implementation class for Entity: Prenotazione
 * RAPPRESENTA UN PACCHETTO PRENOTATO
 */


@Entity
@Table(name="PRENOTAZIONE")
@NamedQueries ({ @NamedQuery (name = Prenotazione.FIND_ALL, query = "SELECT p FROM Prenotazione p"),
				 @NamedQuery (name = Prenotazione.FIND_BY_USER, query = "SELECT DISTINCT pr FROM Prenotazione pr JOIN pr.partecipanti pa WHERE pa.email = :email" ),
				 @NamedQuery (name = Prenotazione.FIND_BY_INVITO, query = "SELECT DISTINCT pr FROM Prenotazione pr JOIN pr.inviti inv WHERE inv.emailInvitato = :email AND inv.rispRicevuta = false" ),
				 @NamedQuery (name = Prenotazione.FIND_BY_CODICELINK, query = "SELECT DISTINCT pr FROM Prenotazione pr JOIN pr.inviti inv WHERE inv.codiceLink = :codiceLink"),
				 @NamedQuery (name = Prenotazione.FIND_BY_USER_E_PREN, query = "SELECT DISTINCT pr FROM Prenotazione pr JOIN pr.partecipanti pa WHERE pa.email = :email AND pr.prenotazioneID = :prenID")

})
public class Prenotazione implements Serializable {

	//Utilizzabili dagli EJB per creare le queries
	public static final String FIND_ALL = "Prenotazione.findAll";
	public static final String FIND_BY_USER = "Prenotazione.findByUser";
	public static final String FIND_BY_INVITO = "Prenotazione.findByInvito";
	public static final String FIND_BY_CODICELINK = "Prenotazione.findByCodiceLink";
	public static final String FIND_BY_USER_E_PREN = "Prenotazione.findByUserEPren";

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int prenotazioneID;
	private String citta;
	private Date dataPartenza;
	private Date dataRitorno;
	
	private static final long serialVersionUID = 1L;

	//relazioni verso HOTEL, VOLO (2), ESCURSIONE, CLIENTE, INVITO
	@OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true)		//relazione one-to-many con Invito
	private List<Invito> inviti;
	
	@ManyToMany
	@JoinTable(name="PARTECIPANTE", 		
		joinColumns={@JoinColumn(name="PRENOTAZIONEID", referencedColumnName="PRENOTAZIONEID")},
		inverseJoinColumns={@JoinColumn(name="EMAIL", referencedColumnName="EMAIL")}
		)
	private List<User> partecipanti;
	
	@ManyToMany
	@JoinTable(name="PRENOTAZIONE_ESCURSIONE", 		
		joinColumns={@JoinColumn(name="PRENOTAZIONEID", referencedColumnName="PRENOTAZIONEID")},
		inverseJoinColumns={@JoinColumn(name="ESCURSIONEID", referencedColumnName="ESCURSIONEID")}
		)
	private List<Escursione> escursioni;
	
	@ManyToOne
    private Volo voloAndata;
	
	@ManyToOne
    private Volo voloRitorno;
	
	@ManyToMany
	@JoinTable(name="PRENOTAZIONE_HOTEL", 		
		joinColumns={@JoinColumn(name="PRENOTAZIONEID", referencedColumnName="PRENOTAZIONEID")},
		inverseJoinColumns={@JoinColumn(name="HOTELID", referencedColumnName="HOTELID")}
		)
	private List<Hotel> hotels;
	
	
	
	//costruttore default
	public Prenotazione() {
		partecipanti = new ArrayList<User>();
		hotels = new ArrayList<Hotel>();
		escursioni = new ArrayList<Escursione>();
		inviti = new ArrayList<Invito>();
	}   
	
	//getters e setters
	public int getPrenotazioneID() {
		return this.prenotazioneID;
	}

	public void setPrenotazioneID(int prenotazioneID) {
		this.prenotazioneID = prenotazioneID;
	}   
	
	public String getCitta() {
		return this.citta;
	}

	public void setCitta(String citta) {
		this.citta = citta;
	}

	public List<Invito> getInviti() {
		return inviti;
	}

	public void setInviti(List<Invito> inviti) {
		this.inviti = inviti;
	}

	public List<User> getPartecipanti() {
		return partecipanti;
	}

	public void setPartecipanti(List<User> partecipanti) {
		this.partecipanti = partecipanti;
	}

	public List<Escursione> getEscursioni() {
		return escursioni;
	}

	public void setEscursioni(List<Escursione> escursioni) {
		this.escursioni = escursioni;
	}

	public Volo getVoloAndata() {
		return voloAndata;
	}

	public void setVoloAndata(Volo voloAndata) {
		this.voloAndata = voloAndata;
	}

	public Volo getVoloRitorno() {
		return voloRitorno;
	}

	public void setVoloRitorno(Volo voloRitorno) {
		this.voloRitorno = voloRitorno;
	}

	public List<Hotel> getHotels() {
		return hotels;
	}

	public void setHotels(List<Hotel> hotels) {
		this.hotels = hotels;
	}

	public Date getDataPartenza() {
		return dataPartenza;
	}

	public void setDataPartenza(Date dataPartenza) {
		this.dataPartenza = dataPartenza;
	}

	public Date getDataRitorno() {
		return dataRitorno;
	}

	public void setDataRitorno(Date dataRitorno) {
		this.dataRitorno = dataRitorno;
	}
   
	
	
}
